﻿#include "mylib.h"  // 包含库标头文件
//#include <iostream> // 包含 iostream 头文件，静态库最好写在 .cpp 文件中
//using std::cout; // 命名空间声明
//using std::endl;
// C/C++ 学习网站：https://legacy.cplusplus.com 注意旧版本（搜索）和新版本

/*
库的相关实现：
	库的实现可以分为静态库和动态库。静态库就是在编译时将所有的代码和数据编译到一个文件中，
	在链接时直接将这个文件链接到程序中。动态库则是将库的函数和数据编译成一个文件，
	然后在程序运行时再将这个文件加载到内存中。
静态库的实现：
	静态库项目的实现比较简单，只需要在编译时将所有的代码和数据编译到一个文件中，然后在链接时
	将这个文件链接到程序中即可；使用 vs 编译器时，可以创建一个主函数接口之外的静态库项目
	需要右键项目->属性->配置属性->常规->配置类型中设置好输出文件类型为静态库即可（注意平台选择）。
	（动态库项目的实现与此类似）
		使用 VS 编译器使用自己创建的静态库：
			上面步骤设置好以后，可以添加静态库项目源文件和头文件，做好之后；
			需要在主函数项目引入静态库项目的头文件，然后编译即可生成静态库文件（.lib 文件）；
			引入静态库项目的头文件可以使用相对路径，本例为：#include "../创建与使用库/库标头.h"，
			其中：../ 表示当前目录的上级目录，也可以使用绝对路径；具体参见引入外部库项目相关说明。
			然后同样需要引入静态库项目的源代码文件，然后主函数项目才能编译即可生成可执行文件：
				右键主函数项目->添加->引用->勾选静态库项目->确定即可。

	静态库的创建（VsCode 配合 g++ 编译器的情况，下面属于FittenCode生成说明）：
		在创建静态库时，需要使用到以下几个步骤：
		1. 创建一个源文件，并在其中定义需要导出的函数和数据。
		2. 使用编译器将源文件编译成一个目标文件。
		3. 使用链接器将目标文件和其他库文件链接成一个静态库。
		下面以一个简单的示例来说明静态库的创建：
		1. 创建一个源文件，并在其中定义两个函数和一个变量：
		#include <iostream>
		using namespace std;
		int add(int a, int b) {
			return a + b;
		}
		int minus(int a, int b) {
			return a - b;
		}
		int num = 10;
		2. 使用编译器将源文件编译成一个目标文件：
		g++ -c add.cpp -o add.o
		3. 使用链接器将目标文件和其他库文件链接成一个静态库：
		ar rcs libadd.a add.o
		4. 编译程序时，需要使用到 -ladd 选项来链接到静态库：
		g++ main.cpp -o main -ladd
		5. 运行程序，可以看到输出结果：
		main.exe
		add(1, 2) = 3
		minus(3, 2) = 1
		num = 10
		说明：
		1. 编译器 g++ 用于编译源文件，ar 用于创建静态库。
		2. 编译命令 g++ main.cpp -o main -ladd 用于编译程序，其中 -ladd 选项用于链接到静态库。
		3. 运行程序 main.exe，可以看到输出结果。


动态库的实现：
	动态库的实现稍微复杂一些，主要是为了解决静态库在程序运行时加载速度慢的问题。
	动态库的实现方式是将库的函数和数据编译成一个文件，然后在程序运行时再将这个文件加载到内存中。
	动态库的优点是可以在程序运行时动态加载，节省了内存开销，并且可以实现多个程序共用同一个库，
	从而提高了程序的灵活性。这里暂时不做实现。
	动态库的创建（VsCode 配合 g++ 编译器的情况，下面属于FittenCode生成说明）：
		动态库的创建与静态库的创建类似，只是在编译时使用 -fPIC 选项来生成位置无关代码（Position-Independent Code，PIC）。
		下面以一个简单的示例来说明动态库的创建：
		1. 创建一个源文件，并在其中定义两个函数和一个变量：
		#include <iostream>
		using namespace std;
		int add(int a, int b) {
			return a + b;
		}
		int minus(int a, int b) {
			return a - b;
		}
		int num = 10;
		2. 使用编译器将源文件编译成一个目标文件：
		g++ -c add.cpp -o add.o -fPIC
		3. 使用链接器将目标文件和其他库文件链接成一个动态库：
		g++ -shared add.o -o libadd.so
		4. 编译程序时，需要使用到 -ladd 选项来链接到动态库：
		g++ main.cpp -o main -ladd
		5. 运行程序，可以看到输出结果：
		main.exe
		add(1, 2) = 3
		minus(3, 2) = 1
		num = 10
		说明：
		1. 编译器 g++ 用于编译源文件，g++ -shared 用于创建动态库。
		2. 编译命令 g++ main.cpp -o main -ladd 用于编译程序，其中 -ladd 选项用于链接到动态库。
		3. 运行程序 main.exe，可以看到输出结果。
*/

namespace self_lib { // 命名空间声明
	float add(float a, float b)
	{
		return a + b;
	}

	float minus(float a, float b)
	{
		return a - b;
	}

	float mul(float a, float b)
	{
		return a * b;
	}

	float div(float a, float b)
	{
		return a / b;
	}
}